#include <iostream>
#include <pthread.h>

// namespace cp
// {
//     class Test
//     {
//     private:
//         // 构造私有化
//         Test()
//         {
//         }
//         // 删除/禁用 拷贝后早和赋值拷贝
//         Test(const Test &t) = delete;
//         Test &operator=(const Test &t) = delete;

//     public:
//         // 静态函数获取句柄
//         static Test *getInStance()
//         {
//             // 双检查加锁
//             if (_test == nullptr)
//             {
//                 // 在每次获取句柄时先加锁
//                 pthread_mutex_lock(&_mutex);
//                 if (_test == nullptr)
//                 {
//                     std::cout << "获取了一个 Test 对象..." << std::endl;
//                     _test = new Test(); // 第一次使用的时候创建
//                 }
//                 // 获取完解锁
//                 pthread_mutex_unlock(&_mutex);
//             }

//             return _test;
//         }

//         void print()
//         {
//             std::cout << "hello world" << std::endl;
//         }

//     private:
//         // 指向静态单例对象的指针
//         static Test *_test;
//         static pthread_mutex_t _mutex;
//     };
//     // 初始化为空指针
//     Test *Test::_test = nullptr;
//     pthread_mutex_t Test::_mutex = PTHREAD_MUTEX_INITIALIZER;
// }



namespace cp
{
    class Test
    {
    private:
        // 构造私有化
        Test() {}
        // 删除拷贝构造函数和赋值运算符，防止复制
        Test(const Test &) = delete;
        Test &operator=(const Test &) = delete;
    public:
        static Test* getInstance()
        {
            static Test _test;
            std::cout << "创建了一个单例对象..." << std::endl;
            return &_test;// C++11 以及更高的版本
        }

        void print()
        {
            std::cout << "hello world" << std::endl;
        }
    };
}

int main()
{
    pthread_t tids[5];
    for (int i = 0; i < 5; i++)
    {
        pthread_create(tids + i, nullptr, [](void *) -> void *
                       {
            auto ptr = cp::Test::getInstance();
            ptr->print();
            return nullptr; }, nullptr);
    }

    for (int i = 0; i < 5; i++)
        pthread_join(tids[i], nullptr);
    return 0;
}